package com.size.mall.cart.service.serviceImpl;

import cn.hutool.core.map.MapUtil;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.size.mall.cart.mapper.OmsCartItemMapper;
import com.size.mall.mallapi.entity.OmsCartItem;
import com.size.mall.mallapi.service.CartService;
import com.size.mall.util.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static cn.hutool.core.util.StrUtil.isNotBlank;

@Service
public class CartServiceImpl implements CartService {

    @Autowired
    RedisUtil redisUtil;

    @Autowired
    OmsCartItemMapper omsCartItemMapper;

    @Override
    public OmsCartItem ifCartExistByUser(String memberId, String skuId) {


        QueryWrapper<OmsCartItem> qw = new QueryWrapper<>();
        qw.eq("member_id", memberId);
        qw.eq("product_sku_id", skuId);


        OmsCartItem omsCartItem1 = omsCartItemMapper.selectOne(qw);
        return omsCartItem1;

    }

    @Override
    public void addCart(OmsCartItem omsCartItem) {
        System.out.println(omsCartItem.getQuantity());
        if (isNotBlank(omsCartItem.getMemberId())) {

            omsCartItem.setId(null);
            omsCartItemMapper.insert(omsCartItem);//避免添加空值
        }
    }

    @Override
    public void updateCart(OmsCartItem omsCartItemFromDb) {

        omsCartItemMapper.updateById(omsCartItemFromDb);

    }

    @Override
    public void flushCartCache(String memberId) {


        List<OmsCartItem> omsCartItems = omsCartItemMapper.selectByMap(MapUtil.of("member_id", memberId));

        // 同步到redis缓存中
        Jedis jedis = redisUtil.getJedis();

        Map<String, String> map = new HashMap<>();
        for (OmsCartItem cartItem : omsCartItems) {
            cartItem.setTotalPrice(cartItem.getPrice().multiply(cartItem.getQuantity()));
            map.put(cartItem.getProductSkuId(), JSON.toJSONString(cartItem));
        }

        jedis.del("user:" + memberId + ":cart");
        jedis.hmset("user:" + memberId + ":cart", map);


        jedis.close();
    }

    @Override
    public List<OmsCartItem> cartList(String userId) {
        Jedis jedis = null;
        List<OmsCartItem> omsCartItems = new ArrayList<>();
        try {
            jedis = redisUtil.getJedis();

            List<String> hvals = jedis.hvals("user:" + userId + ":cart");

            for (String hval : hvals) {
                OmsCartItem omsCartItem = JSON.parseObject(hval, OmsCartItem.class);
                omsCartItems.add(omsCartItem);
            }

        } catch (Exception e) {
            // 处理异常，记录系统日志
            e.printStackTrace();

            return null;
        } finally {
            jedis.close();
        }

        return omsCartItems;
    }


    @Override
    public void checkCart(OmsCartItem omsCartItem) {


        UpdateWrapper<OmsCartItem> uw = new UpdateWrapper<>();

        uw.eq("member_id", omsCartItem.getMemberId());
        uw.eq("product_sku_id", omsCartItem.getProductSkuId());
        omsCartItemMapper.update(omsCartItem, uw);


        // 缓存同步
        flushCartCache(omsCartItem.getMemberId());

    }
}
